package com.fuhao.singleton.Enum;

/**
 * 单例模式之枚举
 * 原理：
 * 1.枚举本身就是单例的都是static final形式，
 * 2.并且是线程安全的。
 * 3.与饿汉模式一致，它无法延迟加载
 * @author zhang
 *
 */
public class User {
	
	/**
	 * 设计思路：
	 * 1.通过使用一个枚举类，帮我们创建我们需要的对象，枚举类并暴露给对象类获取实例的方法
	 * 2.然后再对应的对象类中，获取到实例
	 * @return
	 */
	
	//获取枚举类实例化的用户对象
	static User getInstance() {
		return EnumSingleton.INSTANCE.getUserInstance();
	}
	
	
//###########################枚举类#########################################
	//定义一个枚举类,这个枚举类帮我们实例化我们需要的对象
	enum EnumSingleton{
		//1.定义枚举实例
		INSTANCE;
		
		//2.定义用户变量
		private User user;
		EnumSingleton() {
			//3.这里面帮我们实例化我们想要的对象
			this.user = new User();
		}
		//4.暴露用户实例给对应的对象类调用
		User getUserInstance() {
			return this.user;
		}
	}
//###########################枚举类#########################################	
	
//###########################测试方法#######################################
	public static void main(String[] args) {
		User user1 = User.getInstance();
		User user2 = User.getInstance();
		//true，都是同一个实例
		System.out.println(user1==user2);
	}
//###########################测试方法#######################################	

}
